# -*- coding:utf-8 -*-
__author__   = 'tommy'
__license__  = 'htcharge.com@2016-10-27'
__version__  = 'v1.0.0'

print "**************************************************************************"
print "********************                                   *******************"
print "********************   ThriftServer For App v1.0.0     *******************"
print "********************                                   *******************"
print "********************           Tommy@2016              *******************"
print "********************                                   *******************"
print "**************************************************************************"

import urllib2

import socket, traceback, sys, json
import qutils, HTCMsg, chcode
import qwaterdb, qwater
sys.path.append('./gen-py')

from YLWWater import YLWWater
from YLWWater.ttypes import *

from urllib import urlencode
from thrift import TMultiplexedProcessor
from thrift.transport import TSocket
from thrift.transport import TTransport
from thrift.protocol import TBinaryProtocol
from thrift.server import TServer,TProcessPoolServer

K_API_HOST  = 'http://127.0.0.1:8081'
K_WEB_PORT  = 65525
K_WORK_SIZE = 10

class YLWWaterHandler:
    #*********************************************
    #***获取验证码
    #***参数：
    #    aCard: 卡号
    #*********************************************
    def reqCode(self, aCard):
        qutils.rctLogger.info("******** reqCode *********")
        tmpRsp = ''
        try:
            tmpCard = str(aCard)
            qutils.rctLogger.info("params=" + ",card=" + tmpCard)
            if qutils.isEmpty(tmpCard) :
                return HTCMsg.msgError(-1, qutils.K_ERR_PARAMS)
            
            tmpRsp = qwaterdb.dbSelectGetPhone(tmpCard)

            if qutils.isEmpty(tmpRsp):
                return HTCMsg.msgError(-2, qutils.K_ERR_SRV)

            return tmpRsp
        except Exception, e:
            qutils.rctLogger.error(e)
        return HTCMsg.msgError(-3, qutils.K_ERR_SRV)

    #*********************************************
    #***用户登录
    #***参数：
    #    aCard:      卡号
    #    aCode:      短信验证码
    #    aOsType:    系统类型
    #*********************************************
    def doLogin(self, aCard, aCode, aOsType):
        qutils.rctLogger.info("******** doLogin *********")
        tmpRsp = ''
        try:
            tmpCard     = str(aCard)
            tmpCode     = str(aCode)
            tmpOs       = str(aOsType)
            qutils.rctLogger.info("params=" + ",card=" + tmpCard +",code=" + tmpCode + ",os=" + tmpOs)
            if qutils.isEmpty(tmpCard) or qutils.isEmpty(tmpCode) or qutils.isEmpty(tmpOs):
                return HTCMsg.msgError(-1, qutils.K_ERR_PARAMS)

            if not chcode.isCodeCorrect(tmpCard, tmpCode):
                return HTCMsg.msgError(-4,qutils.K_ERR_CODE_WRONG)

            tmpRsp = qwaterdb.dbSelectGetCardInfos(tmpCard)
            qutils.rctLogger.info(tmpRsp)
            if qutils.isEmpty(tmpRsp):
                return HTCMsg.msgError(-2, qutils.K_ERR_SRV)

            return tmpRsp
        except Exception, e:
            qutils.rctLogger.error(e)
        return HTCMsg.msgError(-3, qutils.K_ERR_SRV)

    #*********************************************
    #***获取用户信息
    #***参数：
    #    aCard:      卡号
    #*********************************************
    def reqUserInfo(self, aCard):
        qutils.rctLogger.info("******** reqUserInfo *********")
        tmpRsp = ''
        try:
            tmpCard     = str(aCard)
            qutils.rctLogger.info("params=" + ",card=" + tmpCard)
            if qutils.isEmpty(tmpCard):
                return HTCMsg.msgError(-1, qutils.K_ERR_PARAMS)

            tmpRsp = qwaterdb.dbSelectGetCardInfos(tmpCard)
            qutils.rctLogger.info(tmpRsp)
            if qutils.isEmpty(tmpRsp):
                return HTCMsg.msgError(-2, qutils.K_ERR_SRV)

            return tmpRsp
        except Exception, e:
            qutils.rctLogger.error(e)
        return HTCMsg.msgError(-3, qutils.K_ERR_SRV)

    #*********************************************
    #***获取设备列表
    #***参数：
    #    aCard:      卡号
    #*********************************************
    def reqListOfDev(self, aCard):
        qutils.rctLogger.info("******** reqListOfDev *********")
        tmpRsp = ''
        try:
            tmpCard     = str(aCard)
            qutils.rctLogger.info("params=" + ",card=" + tmpCard)
            if qutils.isEmpty(tmpCard):
                return HTCMsg.msgError(-1, qutils.K_ERR_PARAMS)

            tmpRsp = qwaterdb.dbSelectGetUsingList(tmpCard)
            qutils.rctLogger.info("usingList=%s" % (tmpRsp))
            if qutils.isEmpty(tmpRsp):
                return HTCMsg.msgError(-2, qutils.K_ERR_SRV)
            return tmpRsp
        except Exception, e:
            qutils.rctLogger.error(e)
        return HTCMsg.msgError(-3, qutils.K_ERR_SRV)

    #*********************************************
    #***根据经纬度获取设备列表
    #***参数：
    #    aCard:      卡号
    #    aLat:       纬度
    #    aLon:       经度
    #*********************************************
    def reqListOfDevByLoc(self, aCard, aLat, aLon):
        qutils.rctLogger.info("******** reqListOfDevByLoc *********")
        tmpRsp = ''
        try:
            tmpCard     = str(aCard)
            tmpLat      = str(aLat)
            tmpLon      = str(aLon)
            qutils.rctLogger.info("params=" + ",card=" + tmpCard)
            if qutils.isEmpty(tmpCard) or qutils.isEmpty(tmpLat) or qutils.isEmpty(tmpLon):
                return HTCMsg.msgError(-1, qutils.K_ERR_PARAMS)

            # tmpRsp = qwaterdb.dbSelectGetLocList(tmpCard, tmpLon, tmpLat)
            tmpRsp = qwaterdb.dbSelectGetLocList(tmpLon, tmpLat)
            qutils.rctLogger.info(tmpRsp)
            if qutils.isEmpty(tmpRsp):
                return HTCMsg.msgError(-2, qutils.K_ERR_SRV)

            return tmpRsp
        except Exception, e:
            qutils.rctLogger.error(e)
        return HTCMsg.msgError(-3, qutils.K_ERR_SRV)

    #*********************************************
    #***获取单个设备信息
    #***参数：
    #    aDid:    设备编号
    #*********************************************
    def reqDevInfo(self ,aCard, aDid):
        qutils.rctLogger.info("******** reqDevInfo *********")
        tmpRsp = ''
        try:
            tmpCard = str(aCard)
            tmpDid  = str(aDid)
            qutils.rctLogger.info("params=" + ",card=" + tmpCard + ",did=" + tmpDid)
            if qutils.isEmpty(tmpCard) or qutils.isEmpty(tmpDid):
                return HTCMsg.msgError(-1, qutils.K_ERR_PARAMS)
            tmpRsp = qwaterdb.dbSelectGetOneDevice(tmpCard, tmpDid)
            qutils.rctLogger.info(tmpRsp)
            if qutils.isEmpty(tmpRsp):
                return HTCMsg.msgError(-2, qutils.K_ERR_SRV)

            return tmpRsp
        except Exception, e:
            qutils.rctLogger.error(e)
        return HTCMsg.msgError(-3, qutils.K_ERR_SRV)

    #*********************************************
    #***开始加水
    #***参数：
    #    aCard:      卡号
    #    aNum:       设备编号
    #*********************************************
    def startWater(self, aCard, aMsn, aMac):
        qutils.rctLogger.info("******** startWater *********")
        tmpRsp = ''
        try:
            tmpCard     = str(aCard)
            tmpMsn      = str(aMsn)
            tmpMac      = str(aMac)
            qutils.rctLogger.info("params=" + ",card=" + tmpCard + ",msn=" + tmpMsn + ",mac=" + tmpMac)
            if qutils.isEmpty(tmpCard) or qutils.isEmpty(tmpMsn) or qutils.isEmpty(tmpMac):
                return HTCMsg.msgError(-1, qutils.K_ERR_PARAMS)

            # tmpRsp = qwaterdb.dbSelectGetLocList(tmpCard, tmpLon, tmpLat)
            # tmpRsp = qwaterdb.dbSelectGetLocList(tmpCard, tmpLon, tmpLat)
            tmpUserStatus = qwaterdb.dbSelectGetUserStatus(tmpCard)

            if tmpUserStatus == -1:
                return HTCMsg.msgError(-4, qutils.K_ERR_START)

            tmpRsp = qwater.cmdStart(tmpMsn,tmpMac)
            if tmpRsp == -1:
                return HTCMsg.msgError(-4, qutils.K_ERR_START)

            return HTCMsg.msgOk()
        except Exception, e:
            qutils.rctLogger.error(e)
        return HTCMsg.msgError(-3, qutils.K_ERR_SRV)

    #*********************************************
    #***停止加水
    #***参数：
    #    aCard:      卡号
    #    aNum:       设备编号
    #*********************************************
    def stopWater(self, aCard, aMsn, aMac):
        qutils.rctLogger.info("******** stopWater *********")
        tmpRsp = ''
        try:
            tmpCard     = str(aCard)
            tmpMsn      = str(aMsn)
            tmpMac      = str(aMac)
            qutils.rctLogger.info("params=" + ",card=" + tmpCard + ",msn=" + tmpMsn + ",mac=" + tmpMac)
            if qutils.isEmpty(tmpCard) or qutils.isEmpty(tmpMsn) or qutils.isEmpty(tmpMac):
                return HTCMsg.msgError(-1, qutils.K_ERR_PARAMS)

            tmpUserStatus = qwaterdb.dbSelectGetUserStatus(tmpCard)

            if tmpUserStatus == -1:
                return HTCMsg.msgError(-4, qutils.K_ERR_STOP)

            tmpRsp = qwater.cmdStop(tmpMsn,tmpMac)
            if tmpRsp == -1:
                return HTCMsg.msgError(-4, qutils.K_ERR_STOP)

            return HTCMsg.msgOk()
        except Exception, e:
            qutils.rctLogger.error(e)
        return HTCMsg.msgError(-3, qutils.K_ERR_SRV)

    #*********************************************
    #***获取账单列表
    #***参数：
    #    aCard:      卡号
    #*********************************************
    def reqListOfDeal(self, aCard, aIdx):
        qutils.rctLogger.info("******** reqListOfDeal *********")
        tmpRsp = ''
        try:
            tmpCard     = str(aCard)
            tmpCount    = str(aIdx)
            qutils.rctLogger.info("params=" + ",card=" + tmpCard + ",idx=" + tmpCount)
            if qutils.isEmpty(tmpCard) or qutils.isEmpty(tmpCount):
                return HTCMsg.msgError(-1, qutils.K_ERR_PARAMS)

            tmpRsp = qwaterdb.dbSelectGetOrderList(tmpCard,aIdx)
            qutils.rctLogger.info("deallist=%s" % (tmpRsp))
            if qutils.isEmpty(tmpRsp):
                return HTCMsg.msgError(-2, qutils.K_ERR_SRV)
            return tmpRsp
        except Exception, e:
            qutils.rctLogger.error(e)
        return HTCMsg.msgError(-3, qutils.K_ERR_SRV)

    #*********************************************
    #***获取账单详情
    #***参数：
    #    aCard:      卡号
    #*********************************************
    def reqDealDetail(self, aOrderNum):
        qutils.rctLogger.info("******** reqDealDetail *********")
        tmpRsp = ''
        try:
            tmpOrderNum = str(aOrderNum)
            qutils.rctLogger.info("params=" + ",ordernum=" + tmpOrderNum)
            if qutils.isEmpty(tmpOrderNum):
                return HTCMsg.msgError(-1, qutils.K_ERR_PARAMS)

            tmpRsp = qwaterdb.dbSelectGetOrderDetail(tmpOrderNum)
            qutils.rctLogger.info("deallist=%s" % (tmpRsp))
            if qutils.isEmpty(tmpRsp):
                return HTCMsg.msgError(-2, qutils.K_ERR_SRV)
            return tmpRsp
        except Exception, e:
            qutils.rctLogger.error(e)
        return HTCMsg.msgError(-3, qutils.K_ERR_SRV)

    #*********************************************
    #***打印小票
    #***参数：
    #    aOrderNum:      订单号
    #*********************************************
    def dealPrint(self, aOrderNum):
        qutils.rctLogger.info("******** dealPrint *********")
        tmpRsp = ''
        try:
            tmpOrderNum = str(aOrderNum)
            qutils.rctLogger.info("params=" + ",ordernum=" + tmpOrderNum)
            if qutils.isEmpty(tmpOrderNum):
                return HTCMsg.msgError(-1, qutils.K_ERR_PARAMS)

            tmpRsp = qwaterdb.dbSelectSetOrderPrint(tmpOrderNum)
            qutils.rctLogger.info(tmpRsp)
            if qutils.isEmpty(tmpRsp):
                return HTCMsg.msgError(-2, qutils.K_ERR_SRV)

            return tmpRsp
        except Exception, e:
            qutils.rctLogger.error(e)
        return HTCMsg.msgError(-3, qutils.K_ERR_SRV)
        
qutils.rctLogger.info("------Created ThriftServer")
tmpProcessor = TMultiplexedProcessor.TMultiplexedProcessor()
handler   = YLWWaterHandler()
tmpProcessor.registerProcessor("YLWWater", YLWWater.Processor(handler))

qutils.rctLogger.info("------Start ThriftServer")
tmpTransport   = TSocket.TServerSocket(port=K_WEB_PORT)
tmpTfactory    = TTransport.TBufferedTransportFactory()
tmpPfactory    = TBinaryProtocol.TBinaryProtocolFactory()

tmpServer      = TProcessPoolServer.TProcessPoolServer(tmpProcessor, tmpTransport, tmpTfactory, tmpPfactory) #7.5ms
tmpServer.setNumWorkers(K_WORK_SIZE)

#tmpServer      = TServer.TForkingServer(tmpProcessor, tmpTransport, tmpTfactory, tmpPfactory) #6.6
#tmpServer      = TServer.TThreadedServer(tmpProcessor, tmpTransport, tmpTfactory, tmpPfactory)
#tmpServer      = TServer.TThreadPoolServer(tmpProcessor, tmpTransport, tmpTfactory, tmpPfactory)
#tmpServer      = TServer.TThreadedSelectorServer(tmpProcessor, tmpTransport, tmpTfactory, tmpPfactory)
qutils.rctLogger.info("------ThriftServer Doing...")
tmpServer.serve()
qutils.rctLogger.info("------ThriftServer done!")

